/*
 * VotantesParser.cpp
 *
 *  Created on: Oct 9, 2011
 *      Author: lore
 */

#include "VotantesParser.h"

VotantesParser::VotantesParser() {
}

VotantesParser::~VotantesParser() {
}


vector<Votante> VotantesParser::parse(string filePath, unsigned long* registrosOK, unsigned long* registrosFAIL,Properties* props) {
	vector<Votante> votantesParseados;

	(*registrosFAIL) = 0;
	(*registrosOK) = 0;

	RSA* rsa = new RSA(props->getInt("RSA_KEY_LENGTH"));
	string pubKeyFile = props->get("RSA_PUBLIC_KEY_FILE");
	Properties* key = new Properties(pubKeyFile);
	if (key->load() == false) {
		delete rsa;
		cerr << "No se pudo cargar el archivo con la clave privada" << endl;
		return votantesParseados;
	}
	unsigned long n = key->getInt("N");
	unsigned long e = key->getInt("E");



	fstream _file;
	_file.open(filePath.c_str(),ios::out | ios::in);

	if (!_file.is_open()) {
	}
	else {
		string aLine; // Se lee archivo linea por linea
		while (getline(_file, aLine)) {
			unsigned long dni;
			string nomyape;
			//unsigned long clave;
			string Domicilio;
			unsigned long distritoid;
			vector<string> idElecciones;
			unsigned long elec = -1;

			// limpio "aLine
			StringUtils su;
			aLine = su.replaceAllOccurences(aLine,"\r"," ");
			aLine = su.replaceAllOccurences(aLine,"\n"," ");
			su.trim(aLine);

			if (aLine.length() == 0) {
				continue;
			}


			size_t separator = aLine.find_first_of('|', 0);	
			if (separator == string::npos) {
				(*registrosFAIL)++;
				continue;
			}

			string dniText = aLine.substr(0,separator);
			
			size_t separator2 = aLine.find_first_of('|', separator+1);	
			string iddistritoText = aLine.substr(separator + 1,separator2 - separator -1);
			
			separator =aLine.find_first_of('|', separator2+1); 
			string claveText = aLine.substr(separator2+1,separator-separator2-1);
			
			separator2 = aLine.find_first_of('|', separator+1);
			nomyape = aLine.substr(separator+1, separator2-separator-1);
			
			separator = aLine.find_first_of('|', separator2+1);
			string domicilio = aLine.substr(separator2+1,separator-separator2-1);
			
			// convertir a unsigned long el dni, clave y id distrito
			dni = strtoul(dniText.c_str(),NULL,0);
			//clave = strtoul(claveText.c_str(), NULL,0);
			distritoid = strtoul(iddistritoText.c_str(),NULL,0);

			// cero no es un ID Valido...los IDs empiezan en 1. Cero es el codigo de error de struol
			if (dni <= 0) { // tb tengo que fijarme que el id de id de distrito este ok.
				(*registrosFAIL)++;
				continue;
			}
			
			string eleccionS = aLine.substr(separator+1);
			idElecciones = su.split(eleccionS,',');

			// Crea el objeto Votante
			
			Votante votante;

			votante.setDni(dni);
			votante.setNombreApellido(nomyape);

			// Clave encriptada!
			string claveEncriptada;
			claveEncriptada = rsa->encrypt(e,n,claveText);
			votante.setClaveEncriptada(claveEncriptada);

	//		cout << "Clave plana: " << claveText << " - ClaveEncriptada: " << claveEncriptada << endl;

			votante.setDomicilio(domicilio);
			votante.setDistritoId(distritoid);
			
			for(int i=0; i< idElecciones.size();i++){
				elec = strtoul(idElecciones.at(i).c_str(),NULL,0);
				votante.addEleccion(elec);
			}	
			votantesParseados.push_back(votante);
		}
	}

	if (rsa != NULL) {
		delete rsa;
		rsa = NULL;
	}
	return votantesParseados;
}


